package code08_常用类.String;

/**
 * @author 黄衡熙
 * @version 1.0
 */
public class Test10_常量池 {
    public static void main(String[] args) {
       // 通过构造方法创建字符串
       // 在堆中开辟一块空间,空间中存储数据admin
       // 在栈中开辟一块空间,空间中存储的是堆内存中开辟的空间地址
       String s = new String("admin");
       // 当重新赋值,相当于重新在堆中开辟一块空间
       // 此时栈中的值指向的是新开辟的空间
       s = new String("alice");

       // 此时的s2并没有指向已有的堆空间,而是重新开辟了
       String s2 = new String("admin");

       // 直接赋值
       // 在常量池中开辟了一块空间
       String s3 = "admin";
       // 在常量池中重新开辟了一块空间
       s3 = "alice";
       // 由于常量池中已经存在拥有admin数据的空间
       // 因此,此时的s4并没有开辟新的空间,而是直接指向了已有的空间
       String s4 = "admin";

       String s5 = new String("admin");
       System.out.println(s2 == s5);

       String s6 = "admin";
       System.out.println(s4 == s6);
        String s7 = "a";
        String s8 = "aa";
        String s9 = "aaa";
        String s10 = s7 + s8;
        // 由于s10不是直接赋值的,而是通过其他变量运算得到的
        // 因此,在运行前是不确定其值是存储在哪的
        // 凡是不确定的一律存储在堆中
        // 此处的s10存储在堆内存中
        System.out.println(s9 == s10);//false

        // 直接写字符串的运算,所设计的所有值都是能够确定是存储在常量池的
        // 因此,s11也是存储在常量池
        String s11 = "a" + "aa";
        System.out.println(s9 == s11);//true

        String s12 = "a" + s8;
        System.out.println(s9 == s12);//false
        System.out.println(s10 == s12);//false
    }
}
